package com.smart.community.feign.region.service;

import com.smart.community.feign.region.dto.PropertyHouseTypeDTO;
import com.smart.community.feign.region.fallback.PropertyHouseTypeFeignFallbackFactory;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * 物业公司户型配置Feign接口
 * 提供户型配置相关的远程调用接口
 * 
 * @author Wu.Liang
 * @version 2.0.0
 * @since 2025-01-30
 */
@Tag(name = "户型配置Feign接口", description = "户型配置相关Feign接口")
@FeignClient(name = "smart-community-region", 
             path = "/region/feign/house-types", 
             fallbackFactory = PropertyHouseTypeFeignFallbackFactory.class,
             contextId = "propertyHouseTypeFeignService")
public interface PropertyHouseTypeFeignService {
    
    /**
     * 根据ID获取户型配置详情
     * 
     * @param id 户型配置ID
     * @return 户型配置详情
     */
    @Operation(summary = "根据ID获取户型配置详情")
    @GetMapping("/{id}")
    PropertyHouseTypeDTO getHouseTypeById(@Parameter(description = "户型配置ID") @PathVariable("id") Long id);
    
    /**
     * 根据物业公司ID查询户型配置列表
     * 
     * @param propertyCompanyId 物业公司ID
     * @return 户型配置列表
     */
    @Operation(summary = "根据物业公司ID查询户型配置列表")
    @GetMapping("/property-company/{propertyCompanyId}")
    List<PropertyHouseTypeDTO> getHouseTypesByPropertyCompanyId(@Parameter(description = "物业公司ID") @PathVariable("propertyCompanyId") Long propertyCompanyId);
    
    /**
     * 根据物业公司ID列表查询户型配置列表
     * 
     * @param propertyCompanyIds 物业公司ID列表
     * @return 户型配置列表
     */
    @Operation(summary = "根据物业公司ID列表查询户型配置列表")
    @PostMapping("/property-companies")
    List<PropertyHouseTypeDTO> getHouseTypesByPropertyCompanyIds(@Parameter(description = "物业公司ID列表") @RequestBody List<Long> propertyCompanyIds);
    
    /**
     * 根据物业公司ID列表获取户型列表（按物业公司分组）
     * 
     * @param propertyCompanyIds 物业公司ID列表
     * @return 按物业公司分组的户型列表
     */
    @Operation(summary = "根据物业公司ID列表获取户型列表（按物业公司分组）")
    @PostMapping("/property-companies/grouped")
    Map<Long, List<PropertyHouseTypeDTO>> getHouseTypesByPropertyCompanyIdsGrouped(@Parameter(description = "物业公司ID列表") @RequestBody List<Long> propertyCompanyIds);
    
    /**
     * 检查户型名称是否已存在
     * 
     * @param houseTypeName 户型名称
     * @param propertyCompanyId 物业公司ID
     * @param excludeId 排除的ID（用于更新时检查）
     * @return 是否已存在
     */
    @Operation(summary = "检查户型名称是否已存在")
    @GetMapping("/check-name")
    Boolean isHouseTypeNameExists(
            @Parameter(description = "户型名称") @RequestParam("houseTypeName") String houseTypeName,
            @Parameter(description = "物业公司ID") @RequestParam("propertyCompanyId") Long propertyCompanyId,
            @Parameter(description = "排除的ID") @RequestParam(value = "excludeId", required = false) Long excludeId);
    
    /**
     * 批量获取户型配置详情
     * 
     * @param ids 户型配置ID列表
     * @return 户型配置详情列表
     */
    @Operation(summary = "批量获取户型配置详情")
    @PostMapping("/batch")
    List<PropertyHouseTypeDTO> getHouseTypesByIds(@Parameter(description = "户型配置ID列表") @RequestBody List<Long> ids);
    
    /**
     * 根据户型名称模糊查询户型配置列表
     * 
     * @param houseTypeName 户型名称
     * @param propertyCompanyId 物业公司ID
     * @return 户型配置列表
     */
    @Operation(summary = "根据户型名称模糊查询户型配置列表")
    @GetMapping("/search/name")
    List<PropertyHouseTypeDTO> searchHouseTypesByName(
            @Parameter(description = "户型名称") @RequestParam("houseTypeName") String houseTypeName,
            @Parameter(description = "物业公司ID") @RequestParam(value = "propertyCompanyId", required = false) Long propertyCompanyId);
    
    /**
     * 获取启用的户型配置列表
     * 
     * @param propertyCompanyId 物业公司ID
     * @return 启用的户型配置列表
     */
    @Operation(summary = "获取启用的户型配置列表")
    @GetMapping("/enabled/{propertyCompanyId}")
    List<PropertyHouseTypeDTO> getEnabledHouseTypes(@Parameter(description = "物业公司ID") @PathVariable("propertyCompanyId") Long propertyCompanyId);
    
    /**
     * 根据建筑面积范围查询户型配置
     * 
     * @param minArea 最小面积
     * @param maxArea 最大面积
     * @param propertyCompanyId 物业公司ID
     * @return 户型配置列表
     */
    @Operation(summary = "根据建筑面积范围查询户型配置")
    @GetMapping("/search/area")
    List<PropertyHouseTypeDTO> searchHouseTypesByArea(
            @Parameter(description = "最小面积") @RequestParam("minArea") Double minArea,
            @Parameter(description = "最大面积") @RequestParam("maxArea") Double maxArea,
            @Parameter(description = "物业公司ID") @RequestParam(value = "propertyCompanyId", required = false) Long propertyCompanyId);
    
    /**
     * 根据朝向查询户型配置
     * 
     * @param orientation 朝向
     * @param propertyCompanyId 物业公司ID
     * @return 户型配置列表
     */
    @Operation(summary = "根据朝向查询户型配置")
    @GetMapping("/search/orientation")
    List<PropertyHouseTypeDTO> searchHouseTypesByOrientation(
            @Parameter(description = "朝向") @RequestParam("orientation") String orientation,
            @Parameter(description = "物业公司ID") @RequestParam(value = "propertyCompanyId", required = false) Long propertyCompanyId);
    
    /**
     * 根据适用人群查询户型配置
     * 
     * @param suitableCrowd 适用人群
     * @param propertyCompanyId 物业公司ID
     * @return 户型配置列表
     */
    @Operation(summary = "根据适用人群查询户型配置")
    @GetMapping("/search/crowd")
    List<PropertyHouseTypeDTO> searchHouseTypesByCrowd(
            @Parameter(description = "适用人群") @RequestParam("suitableCrowd") String suitableCrowd,
            @Parameter(description = "物业公司ID") @RequestParam(value = "propertyCompanyId", required = false) Long propertyCompanyId);
    
    /**
     * 获取户型配置统计信息
     * 
     * @param propertyCompanyId 物业公司ID
     * @return 统计信息
     */
    @Operation(summary = "获取户型配置统计信息")
    @GetMapping("/statistics/{propertyCompanyId}")
    Object getHouseTypeStatistics(@Parameter(description = "物业公司ID") @PathVariable("propertyCompanyId") Long propertyCompanyId);
    
    /**
     * 检查户型配置是否存在
     * 
     * @param id 户型配置ID
     * @return 是否存在
     */
    @Operation(summary = "检查户型配置是否存在")
    @GetMapping("/check/{id}")
    Boolean checkHouseTypeExists(@Parameter(description = "户型配置ID") @PathVariable("id") Long id);
}
